// 重载
// 普通重载
// JavaScript本身是个动态语言 JavaScript里函数
// 根据传入不同的参数而返会不同类型的数据是很常见的
// pickCard方法根据传入参数的不同会返回俩种不同的类型
// 如果传入的是代表纸牌的对象, 函数作用是从中抓一张牌
// 如果用户想抓拍牌,我们告诉他抓到了什么牌
var suits = ["hearts", "spdes", "clubs", "diamonds"];
// 函数返回值可以是任何类型
function pickCard(x) {
    if (typeof x == "object") {
        var pickedCard = Math.floor(Math.random() * x.length);
        return pickedCard;
    }
    else if (typeof x == 'number') {
        var pickedSuit = Math.floor(x / 13);
        return { suit: suits[pickedSuit], card: x % 1 };
    }
}
var myDeck = [
    { suit: "diamonds", card: 2 },
    { suit: "spades", card: 10 },
    { suit: "hearts", card: 4 }
];
var pickedCard1 = myDeck[pickCard(myDeck)];
console.log("card: " + pickedCard1.card + " of " + pickedCard1.suit);
var pickedCard2 = pickCard(15);
console.log("card: " + pickedCard2.card + " of " + pickedCard2.suit);
// Typescript 基于类型系统的函数重载实现
// 方法是为同一个函数提供多个函数类型定义来进行函数重载
// 编译器会根据这个列表去处理函数的调用
// 面我们来重载pickCard函数
// 简单来说就是通过多重类型定义来预设多种允许的参数和返回值
// 从而实现存在的类型判断
// 注意, function pickCard(x):any并不是重载列表的一部分,
// 因此这里只有两个重载: 一个是接收对象另一个是接受数字
// 以其他参数调用pickCard会产生错误
var suits2 = ["hearts", "spades", "clubs", "diamnds"];
// 此处函数不可变,下次串案是会自动调用上面的接口设置
function pickCard2(x) {
    if (typeof x == "object") {
        var pickedCard = Math.floor(Math.random() * x.length);
        return pickedCard;
    }
    else if (typeof x == 'number') {
        var pickedSuit = Math.floor(x / 13);
        return { suit: suits2[pickedSuit], card: x % 13 };
    }
}
var myDeck2 = [
    { suit: "diamonds", card: 2 },
    { suit: "spades", card: 10 },
    { suit: "hearts", card: 4 }
];
// 此处要是属性名称错误,则直接报错
var pickedCard3 = myDeck2[pickCard2(myDeck2)];
console.log("card:  " + pickedCard3.card + " of " + pickedCard3.suit);
var pickedCard4 = pickCard2(15);
// 此处要是传入的是字符串或是其他的也会直接报错
console.log("card: " + pickedCard4.card + " of " + pickedCard4.suit);
